"""EDA指标定义配置

定义了所有EDA（皮肤电导）分析中使用的指标，包括：
- 基础统计指标
- SCR（皮肤电反应）相关指标  
- 频域指标
- SCL（皮肤电导水平）指标
- 质量评估指标

每个指标包含名称、单位、描述和约束条件。
"""

from typing import Dict, Any

# EDA指标定义字典
EDA_METRICS_DEFINITION: Dict[str, Dict[str, Any]] = {
    # 基础统计指标
    'mean_eda': {
        'name': 'EDA均值', 
        'unit': 'μS', 
        'description': 'EDA信号平均值',
        'range': (0, 100),
        'precision': 3
    },
    'std_eda': {
        'name': 'EDA标准差', 
        'unit': 'μS', 
        'description': 'EDA信号标准差',
        'range': (0, 50),
        'precision': 3
    },
    'min_eda': {
        'name': 'EDA最小值', 
        'unit': 'μS', 
        'description': 'EDA信号最小值',
        'range': (0, 100),
        'precision': 3
    },
    'max_eda': {
        'name': 'EDA最大值', 
        'unit': 'μS', 
        'description': 'EDA信号最大值',
        'range': (0, 100),
        'precision': 3
    },
    'range_eda': {
        'name': 'EDA范围', 
        'unit': 'μS', 
        'description': 'EDA信号最大值与最小值之差',
        'range': (0, 100),
        'precision': 3
    },
    'skewness': {
        'name': '偏度', 
        'unit': '无', 
        'description': 'EDA信号分布偏度',
        'range': (-10, 10),
        'precision': 3
    },
    'kurtosis': {
        'name': '峰度', 
        'unit': '无', 
        'description': 'EDA信号分布峰度',
        'range': (-10, 10),
        'precision': 3
    },
    
    # SCR相关指标
    'scr_count': {
        'name': 'SCR数量', 
        'unit': '个', 
        'description': '皮肤电反应事件数量',
        'range': (0, 1000),
        'precision': 0
    },
    'mean_scr_amplitude': {
        'name': '平均SCR幅度', 
        'unit': 'μS', 
        'description': 'SCR事件平均幅度',
        'range': (0, 10),
        'precision': 4
    },
    'max_scr_amplitude': {
        'name': '最大SCR幅度', 
        'unit': 'μS', 
        'description': 'SCR事件最大幅度',
        'range': (0, 20),
        'precision': 4
    },
    'mean_scr_width': {
        'name': '平均SCR宽度', 
        'unit': '秒', 
        'description': 'SCR事件平均持续时间',
        'range': (0, 60),
        'precision': 2
    },
    'scr_frequency_per_min': {
        'name': 'SCR频率', 
        'unit': '次/分钟', 
        'description': '每分钟SCR事件数量',
        'range': (0, 100),
        'precision': 2
    },
    'mean_scr_interval_s': {
        'name': '平均SCR间隔', 
        'unit': '秒', 
        'description': 'SCR事件平均间隔时间',
        'range': (0, 300),
        'precision': 2
    },
    'std_scr_interval_s': {
        'name': 'SCR间隔标准差', 
        'unit': '秒', 
        'description': 'SCR事件间隔时间标准差',
        'range': (0, 200),
        'precision': 2
    },
    
    # 频域指标
    'vlf_power': {
        'name': 'VLF功率', 
        'unit': 'μS²/Hz', 
        'description': '极低频段功率(0.0033-0.04Hz)',
        'range': (0, 1000),
        'precision': 6
    },
    'lf_power': {
        'name': 'LF功率', 
        'unit': 'μS²/Hz', 
        'description': '低频段功率(0.04-0.15Hz)',
        'range': (0, 1000),
        'precision': 6
    },
    'mf_power': {
        'name': 'MF功率', 
        'unit': 'μS²/Hz', 
        'description': '中频段功率(0.15-0.4Hz)',
        'range': (0, 1000),
        'precision': 6
    },
    'total_power': {
        'name': '总功率', 
        'unit': 'μS²/Hz', 
        'description': '总功率谱密度',
        'range': (0, 10000),
        'precision': 6
    },
    'vlf_ratio_percent': {
        'name': 'VLF功率比', 
        'unit': '%', 
        'description': '极低频段功率占比',
        'range': (0, 100),
        'precision': 2
    },
    'lf_ratio_percent': {
        'name': 'LF功率比', 
        'unit': '%', 
        'description': '低频段功率占比',
        'range': (0, 100),
        'precision': 2
    },
    'mf_ratio_percent': {
        'name': 'MF功率比', 
        'unit': '%', 
        'description': '中频段功率占比',
        'range': (0, 100),
        'precision': 2
    },
    'peak_freq_hz': {
        'name': '主频', 
        'unit': 'Hz', 
        'description': '功率谱峰值频率',
        'range': (0, 2),
        'precision': 4
    },
    
    # SCL指标
    'scl_mean': {
        'name': 'SCL均值', 
        'unit': 'μS', 
        'description': '皮肤电导水平平均值',
        'range': (0, 100),
        'precision': 3
    },
    'scl_median': {
        'name': 'SCL中位数', 
        'unit': 'μS', 
        'description': '皮肤电导水平中位数',
        'range': (0, 100),
        'precision': 3
    },
    'scl_std': {
        'name': 'SCL标准差', 
        'unit': 'μS', 
        'description': '皮肤电导水平标准差',
        'range': (0, 50),
        'precision': 3
    },
    'scl_min': {
        'name': 'SCL最小值', 
        'unit': 'μS', 
        'description': '皮肤电导水平最小值',
        'range': (0, 100),
        'precision': 3
    },
    'scl_max': {
        'name': 'SCL最大值', 
        'unit': 'μS', 
        'description': '皮肤电导水平最大值',
        'range': (0, 100),
        'precision': 3
    },
    'scl_range': {
        'name': 'SCL范围', 
        'unit': 'μS', 
        'description': 'SCL最大值与最小值之差',
        'range': (0, 100),
        'precision': 3
    },
    'scl_cv': {
        'name': 'SCL变异系数', 
        'unit': '无', 
        'description': 'SCL标准差与均值之比',
        'range': (0, 5),
        'precision': 3
    },
    'scl_baseline_mean': {
        'name': '基线SCL均值', 
        'unit': 'μS', 
        'description': 'SCR事件间基线水平均值',
        'range': (0, 100),
        'precision': 3
    },
    'scl_baseline_std': {
        'name': '基线SCL标准差', 
        'unit': 'μS', 
        'description': '基线水平标准差',
        'range': (0, 50),
        'precision': 3
    },
    'scl_trend_slope': {
        'name': 'SCL趋势斜率', 
        'unit': 'μS/秒', 
        'description': 'SCL随时间变化趋势',
        'range': (-1, 1),
        'precision': 6
    },
    'scl_trend_r_squared': {
        'name': 'SCL趋势拟合度', 
        'unit': '无', 
        'description': 'SCL趋势线性拟合R²值',
        'range': (0, 1),
        'precision': 4
    },
    
    # 质量评估指标
    'snr_db': {
        'name': '信噪比', 
        'unit': 'dB', 
        'description': '信号与噪声功率比',
        'range': (-20, 60),
        'precision': 2
    },
    'zero_ratio_percent': {
        'name': '零值比例', 
        'unit': '%', 
        'description': '零值数据点占比',
        'range': (0, 100),
        'precision': 2
    },
    'signal_stability': {
        'name': '信号稳定性', 
        'unit': '无', 
        'description': '信号变异系数倒数',
        'range': (0, 10),
        'precision': 3
    },
    'scr_ratio': {
        'name': 'SCR比率', 
        'unit': '无', 
        'description': '实际SCR与预期SCR数量比',
        'range': (0, 5),
        'precision': 3
    },
    'quality_score': {
        'name': '质量评分', 
        'unit': '分', 
        'description': '综合信号质量评分(0-100)',
        'range': (0, 100),
        'precision': 1
    }
}

# 指标分组定义
METRICS_GROUPS = {
    '基础统计': [
        'mean_eda', 'std_eda', 'min_eda', 'max_eda', 
        'range_eda', 'skewness', 'kurtosis'
    ],
    'SCR指标': [
        'scr_count', 'mean_scr_amplitude', 'max_scr_amplitude',
        'mean_scr_width', 'scr_frequency_per_min', 
        'mean_scr_interval_s', 'std_scr_interval_s'
    ],
    '频域指标': [
        'vlf_power', 'lf_power', 'mf_power', 'total_power',
        'vlf_ratio_percent', 'lf_ratio_percent', 'mf_ratio_percent',
        'peak_freq_hz'
    ],
    'SCL指标': [
        'scl_mean', 'scl_median', 'scl_std', 'scl_min', 'scl_max',
        'scl_range', 'scl_cv', 'scl_baseline_mean', 'scl_baseline_std',
        'scl_trend_slope', 'scl_trend_r_squared'
    ],
    '质量评估': [
        'snr_db', 'zero_ratio_percent', 'signal_stability',
        'scr_ratio', 'quality_score'
    ]
}

def get_metric_info(metric_name: str) -> Dict[str, Any]:
    """获取指标信息
    
    Args:
        metric_name: 指标名称
        
    Returns:
        指标信息字典，如果指标不存在则返回None
    """
    return EDA_METRICS_DEFINITION.get(metric_name)

def get_metrics_by_group(group_name: str) -> list:
    """根据分组获取指标列表
    
    Args:
        group_name: 分组名称
        
    Returns:
        指标名称列表
    """
    return METRICS_GROUPS.get(group_name, [])

def validate_metric_value(metric_name: str, value: float) -> bool:
    """验证指标值是否在合理范围内
    
    Args:
        metric_name: 指标名称
        value: 指标值
        
    Returns:
        是否在合理范围内
    """
    metric_info = get_metric_info(metric_name)
    if not metric_info or 'range' not in metric_info:
        return True
    
    min_val, max_val = metric_info['range']
    return min_val <= value <= max_val